#include "../lib/Ville.hpp"
#include "../lib/Joueur.hpp"
#include "../lib/Coordonnes.hpp"
#include "../lib/Partie.hpp"
#include <cassert>
#include <math.h>
using namespace std;


void Init_Ville ( Ville * V)
{
    V->pdv = 50;
    Init_Coord (V->pos);
}

Ville * Alloue_Ville ()
{
    Ville * V = new Ville;
    V->pos = Creer_Coord();
    Init_Ville (V);

    return V;
}

void Testament_Ville ( Ville * V )
{
    Testament_Coord (V->pos);
    delete V;
}

bool Norme_Villes_Inf_Trois( unsigned int x, unsigned int y, Partie * P )
{
    bool b = true;
    int norme=0;

    for (unsigned int i = 0 ; i < P->Jhumain->nb_ville ; i ++)
    {
        norme = sqrt((x - P->Jhumain->tab_ville[i]->pos->x  )*(x - P->Jhumain->tab_ville[i]->pos->x  )
                   + (y - P->Jhumain->tab_ville[i]->pos->y  )*(y - P->Jhumain->tab_ville[i]->pos->y  ));
        //cout << norme<< endl;

        if ( norme < 3  )
        {
            b = false;
        }
    }

    for (unsigned int i = 0 ; i < P->IA->nb_ville ; i ++)
    {
        norme =sqrt ((x - P->IA->tab_ville[i]->pos->x  )*(x - P->IA->tab_ville[i]->pos->x  )
                    + (y - P->IA->tab_ville[i]->pos->y  )*(y - P->IA->tab_ville[i]->pos->y  ));
        //cout << norme<< endl;
        if (  norme   < 3  )
        {
            b = false;
        }
    }
    //cout << b << endl;
    return b;
}

Ville * Creer_Ville ( Joueur * J, unsigned int x, unsigned int y, Partie * P )
{
    Ville * V;
    if ( Norme_Villes_Inf_Trois( x,y, P)== true )
    {
        V = Alloue_Ville();

        Affecte_Ville_Coord ( V , x ,  y );
        Ajout_Ville( J , V);
    }
    else
        V=NULL;

    return V;
}



Coord * Retourne_Coord_Ville ( const Ville * V )
{
    return V->pos;
}


unsigned int Retourne_Pdv_Ville ( Ville * V )
{
    return V->pdv;
}


void Retranche_Pdv (Ville * V , int donnee)
{
    V->pdv = V->pdv - donnee;
}

void Affecte_Ville_Coord ( Ville * V, unsigned int x, unsigned int y)
{
    Affecte_Coord ( V->pos , x, y);
}



int Test_Regression_Ville ()
{
    Ville * V = Alloue_Ville();
    Coord * C;
    Partie * P = Creer_Partie();
    int pdv;




    assert(V->pdv == 50);
    assert(V->pos->x == 0);
    assert(V->pos->x == 0);

    cout<<"Test du module ville : Entrez les valeurs à tester"<<endl;
    unsigned int x;
    cout<<"x : "<<endl;
    cin>>x;

    unsigned int y;
    cout<<"y : "<<endl;
    cin>>y;

    int donnee;
    cout<<"donnee : "<<endl;
    cin>>donnee;



    Creer_Ville (P->Jhumain, x, y, P );
    assert(V->pos->x >= 0);
    assert(V->pos->y >= 0);

    C = Retourne_Coord_Ville (V);
    assert(C->x >= 0);
    assert(C->y >= 0);

    pdv = Retourne_Pdv_Ville (V);
    assert (pdv == V->pdv);

    Retranche_Pdv (V,donnee);
    assert((pdv - donnee) == V->pdv);


    Testament_Ville(V);
    Testament_Partie(P);

    return 1;

}

